Commercial computer systems require many interdependent software programs in order to perform useful functions. These software programs include an operating system, various hardware drivers, and one or more applications. Current software programs often rely on external software components, known as shared libraries, dynamic-linked libraries, shared objects, or plug-ins, which are self-contained sets of related routines that can be accessed by software programs in order to provide functionality.
Often, the software components, collectively referred to hereinafter as shared libraries, are used by multiple software programs. This sharing of resources increases overall efficiency and performance since the computer system does not need to store many programs having overlapping functionality, and the shared libraries can be loaded and executed only when needed.
Similarly, operating systems rely on hardware drivers and helper applications to perform many of the basic functions of the operating system, including accessing network interface cards (NICs), human interface devices (e.g., keyboards, mice, touch pads, etc.), and display screens.
A benefit to the modular design of current software is the ability to periodically upgrade one portion of the software program without requiring a complete reinstallation of the software program. With respect to reinstalling an operating system, several hours may be required for the process. Such periodic upgrades can be initiated in an effort to correct software bugs, newly identified security flaws, and implement new features. As a result, bugs and security flaws can be corrected within days of a problem being identified.
However, along with the above benefits, the modularity of modern software programs also present certain disadvantages, the most significant being incompatibility with particular versions of shared libraries or drivers. These incompatibilities can lead to instability of the software program (i.e., crashes) at a minimum, and often can lead to the software program failing to execute at all.
Because a modern computer system has many software programs using a multitude of shared libraries, drivers and helper applications of one type or another, most of which remain hidden to the general computer user, it is often difficult to identify which of these components may be causing an error.